#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>
#include <cJSON.h>
#include <list.h>
#include <msg_queue_peer.h>
#include <pthread.h>
#include <error.h>

volatile int mode,Time;
volatile int equipment; //0：M0 1:modbus
volatile struct std_node *m0;
volatile struct std_node *modbus;

union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //属于哪个设备：m0或modbus
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

//消息队列的结构体
struct msgbuf
{
    long mtype;
    char mdata[256];
};

//通信的不同的主题
#define TOPIC_DATA_UP        "app/data/up"     //上报进程给客户端上报数据
#define TOPIC_DATA_DOWN      "app/data/down"   //客户端给上报进程下发采集指令
#define TOPIC_CONTROL_UP     "app/control/up"  //上报进程到客户端
#define TOPIC_CONTROL_DOWN   "app/control/down"//客户端到上报进程
#define TOPIC_MODE_UP        "app/mode/up"     //上报进程到客户端
#define TOPIC_MODE_DOWN      "app/mode/down"   //客户端到上报进程

//设备数量
#define M0_NUMBER 3 //M0设备数量
#define MODBUS_NUMBER 2 //modbus设备节点数量


void delivered(void *context, MQTTClient_deliveryToken dt);
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message);
void connlost(void *context, char *cause);
int client_to_mqtt();
int mqtt_to_client(char *topical,cJSON *root);

cJSON * read_shm_all(struct std_node *m0,struct std_node *modbus); //读取共享内存的所有数据
struct std_node* shm(char *s);                                     //创建共享内存
void change_up(struct std_node *m0,struct std_node *modbus);       //实现变化上报


#endif